home *** CD-ROM | disk | FTP | other *** search
- (* This program initializes an array and performs
- various different sorts. *)
-
- MODULE Sort;
- FROM InOut IMPORT Write,WriteLn,WriteCard,WriteInt,Read,WriteString;
-
-
- CONST n= 256;
- nn=512;
-
- TYPE index =[0..nn];
- item = RECORD
- key : INTEGER;
- END;
- VAR i : index;
- r : INTEGER;
- a : ARRAY [-15..nn] OF item;
- z : ARRAY [1..n] OF INTEGER;
- Ch: CHAR;
-
- PROCEDURE BubbleSort;
- VAR i,j : index;
- x : item;
-
- BEGIN
- FOR i := 2 TO n DO
- FOR j := n TO i BY -1 DO
- IF a[j-1].key > a[j].key THEN
- x := a[j-1];
- a[j-1] := a[j];
- a[j] := x;
- END
- END
- END
- END BubbleSort;
-
- PROCEDURE Bubblex;
- VAR j,k,l : index;
- x : item;
-
- BEGIN
- l := 2;
- REPEAT
- k := n;
- FOR j := n TO l BY -1 DO
- IF a[j-1].key > a[j].key THEN
- x := a[j-1]; a[j-1] := a[j]; a[j] := x;
- k := j
- END
- END;
- l := k + 1;
- UNTIL l > n
- END Bubblex;
-
- PROCEDURE ShakerSort;
- VAR j,k,l,r : index;
- x : item;
-
- BEGIN
- l := 2; r := n; k := n;
- REPEAT
- FOR j := n TO l BY -1 DO
- IF a[j-1].key > a[j].key THEN
- x := a[j-1];
- a[j-1] := a[j];
- a[j] := x;
- k :=j
- END
- END;
- l := k + 1;
- FOR j := l TO r DO
- IF a[j-1].key > a[j].key THEN
- x := a[j-1];
- a[j-1] := a[j];
- a[j] := x;
- k :=j
- END
- END;
- r := k - 1;
- UNTIL l > r
- END ShakerSort;
-
- PROCEDURE QuickSort;
-
- PROCEDURE sort(l,r:index);
- VAR i,j : index;
- x,w : item;
- BEGIN
- i := l; j :=r;
- x := a[(l + r) DIV 2];
- REPEAT
- WHILE a[i].key < x.key DO INC(i) END;
- WHILE x.key < a[j].key DO DEC(j) END;
- IF i <= j THEN
- w := a[i];
- a[i] := a[j];
- a[j] := w;
- INC(i);
- DEC(j);
- END;
- UNTIL i > j;
- IF l < j THEN sort(l,j) END;
- IF i < r THEN sort(i,r) END;
- END sort;
- BEGIN
- sort(1,n)
- END QuickSort;
-
- PROCEDURE QuickSort1;
- CONST m = 12;
- TYPE ss = [0..m];
- VAR i,j,l,r : index;
- x,w : item;
- s : ss;
- stack : ARRAY [1..m] OF RECORD l,r : index END;
- BEGIN
- s := 1; stack[1].l := 1; stack[1].r := n;
- REPEAT
- l := stack[s].l; r := stack[s].r; DEC(s);
- REPEAT
- i := l; j := r; x := a[(l + r) DIV 2];
- REPEAT
- WHILE a[i].key < x.key DO INC(i) END;
- WHILE x.key < a[j].key DO DEC(j) END;
- IF i <= j THEN
- w := a[i]; a[i] := a[j]; a[j] := w;
- INC(i);DEC(j);
- END;
- UNTIL i > j;
- IF i < r THEN
- INC(s); stack[s].l := i; stack[s].r := r;
- END;
- r := j
- UNTIL l >=r
- UNTIL s = 0
- END QuickSort1;
-
- BEGIN (*Main*)
- i := 0;
- r :=54;
- REPEAT
- INC(i);
- r := (8 * r) MOD 2141;
- z[i] :=r;
- UNTIL i = n;
- FOR i := 1 TO n DO
- a[i].key := z[i];
- END;
- BubbleSort;
- FOR i := 1 TO n DO
- WriteString("Changed BubbleSort-> ");
- WriteInt(a[i].key,3);
- WriteLn;
- END;
- WriteLn;
- Read(Ch);
- FOR i := 1 TO n DO
- a[i].key := z[i];
- END;
- QuickSort;
- FOR i := 1 TO n DO
- WriteString("Changed QuickSort-> ");
- WriteInt(a[i].key,3);
- WriteLn;
- END;
- WriteLn;
- Read(Ch);
- FOR i := 1 TO n DO
- a[i].key := z[i];
- END;
- QuickSort1;
- FOR i := 1 TO n DO
- WriteString("Changed QuickSort1-> ");
- WriteInt(a[i].key,3);
- WriteLn;
- END;
- WriteLn;
- Read(Ch);
- FOR i := 1 TO n DO
- a[i].key := z[i];
- END;
- Bubblex;
- FOR i := 1 TO n DO
- WriteString("Changed Bubblex-> ");
- WriteInt(a[i].key,3);
- WriteLn;
- END;
- WriteLn;
- Read(Ch);
- FOR i := 1 TO n DO
- a[i].key := z[i];
- END;
- ShakerSort;
- FOR i := 1 TO n DO
- WriteString("Changed ShakerSort-> ");
- WriteInt(a[i].key,3);
- WriteLn;
- END;
- WriteLn;
- END Sort.
-